iT邦幫忙

2023 iThome 鐵人賽

DAY 11
2
自我挑戰組

WiFiBoy Python 玩學機介紹系列 第 11

11. 讓 LED 燈環顯示

  • 分享至 

  • xImage
  •  

LED 燈環介紹

玩學運算科技有出品一種燈環套件,是使用 12 顆 LED 燈構成的電路板。這個燈環的運作原理是跟 WS2812 LED 一樣。在這個套件中,驅動這個燈環的腳位是 Pin 2,寫程式時要記得修改,不要照抄別地方的範例程式,卻發現不能執行。

正面

反面

什麼是 WS2812B 呢? WS2812B 是一種廣泛應用於 LED 燈帶或是LED 燈板照明應用的智慧型燈珠。具有相當多特色與優點,廣受市場歡迎,特色如下:

  1. 每個 LED 都可控制。您可以透過控制電路,讓每個 LED 燈有著不同的顏色與亮度。
  2. 單線式控制。數據通過時間序列傳輸,每個LED將數據傳遞到下一個LED,可輕鬆串聯多個。
  3. 可串列多個裝置使用。能變成線性燈帶、矩形燈板或是各種形式的產品。
  4. 低功耗。只要使用電池就能驅動,在裝置藝術、照明、DIY專案與物聯網設備中廣泛應用。

WS2812B LED 您可以在此連結下載技術文件。而這種LED 又常被稱為「NeoPixel」。Neopixel 內部實際上有3個LED(紅色、綠色與藍色)燈,和一個微小的控制電路。

燈板

燈條

MicroPython NeoPixel 函式庫解說

Micropython NeoPixel 的文件在兩個地方,主要有「NeoPixel driver」與「Controlling NeoPixels 」我們先看 Driver 這邊的原始碼:

from machine import Pin
from neopixel import NeoPixel
pin = Pin(12, Pin.OUT)   # 這邊我們要修改為
np = NeoPixel(pin, 12)   # 玩學機燈環的數目為 12
np[0] = (255, 255, 255)  # 設定LED燈為白光
np.write()               # 將數值輸出,即為點燈
r, g, b = np[0]        

另外在「Controlling NeoPixels」處,有提到一個很重要的地方。就是我們要控制 NeoPixels 需要先引入幾個重要的函式庫。

  1. machine : 要定義 machine.Pin(2) 輸出的腳位
  2. neopixel: 建立 NeoPixel 物件,例如 np = neopixel.NeoPixel(machine.Pin(2), 12)
  3. time: 要使用 time.sleep() 函數,產生各種視覺暫留的效果。

另外NeoPixel模組支援超過3種顏色的燈,像是 RGBW或 RGBY,使用 bpp 參數來控制。如果是四色燈,就用「bpp=4」,來初始化物件。但我們用的燈環是 RGB的形式,所以我們使用「bpp=3」,來設定每個燈的顏色。

像我們要讓第一個燈變成紅色,可以執行這樣的程式碼,np[0] = (128, 0, 0)。

應用範例

範例一: 產生一個紅燈,每個一秒繞著燈環跑

import time
from machine import Pin
from neopixel import NeoPixel

pin = Pin(2, Pin.OUT)    
np = NeoPixel(pin, 12)   
for i in range(0, 12):   
    np[i] = (64, 0, 0) 
    np.write()            
    time.sleep(1)
    np[i] = (0, 0, 0) 
    np.write()     

範例二: 執行 NeoPixel 文件裡面的範例程式

import time
import machine, neopixel
np = neopixel.NeoPixel(machine.Pin(2), 12, bpp = 3)

def demo(np):
    n = np.n

    # cycle
    for i in range(4 * n):
        for j in range(n):
            np[j] = (0, 0, 0)
        np[i % n] = (255, 255, 255)
        np.write()
        time.sleep_ms(25)

    # bounce
    for i in range(4 * n):
        for j in range(n):
            np[j] = (0, 0, 128)
        if (i // n) % 2 == 0:
            np[i % n] = (0, 0, 0)
        else:
            np[n - 1 - (i % n)] = (0, 0, 0)
        np.write()
        time.sleep_ms(60)

    # fade in/out
    for i in range(0, 4 * 256, 8):
        for j in range(n):
            if (i // 256) % 2 == 0:
                val = i & 0xff
            else:
                val = 255 - (i & 0xff)
            np[j] = (val, 0, 0)
        np.write()

    # clear
    for i in range(n):
        np[i] = (0, 0, 0)
    np.write()
demo(np)

範例三: 電子骰子,會發出聲音,且會更新螢幕畫面。

![電子骰子](https://ithelp.ithome.com.tw/upload/images/20230912/201057072BpCryNgc6.png)
# 彩燈骰子
import time
import neopixel
# 蜂鳴器啟動
machine.Pin(17, 2).value(1)
snd = machine.PWM(machine.Pin(25,2))
snd.duty(0)

def play(f, t):
    snd.freq(f); snd.duty(50)
    time.sleep(t); snd.duty(0)

# 燈環控制
numbers = 12
np = neopixel.NeoPixel(machine.Pin(2), numbers, bpp = 3)
wb.cls()
while True:
    if wb.getkey() > 0:
        count = wb.rand() % 100 + 20
        for i in range(1, count):
            np[i%numbers] = (64, 0, 0)
            play(880, 0.02)
            np.write()
            wb.str(str(i%numbers), 10, 20, 2, 15)
            if i == count-1:
                print('')
            else:
                wb.cls()
            np[i%numbers] = (0, 0, 0)
            time.sleep(0.01)

玩了好幾個LED範例,是不是覺得很炫呢?明天我們要解釋聲音產生的原理與程式。請繼續「遊戲音樂引擎展示」的課程。明天見!


上一篇
10. 用玩學機來算數學
下一篇
12. 遊戲音樂引擎展示
系列文
WiFiBoy Python 玩學機介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言